package com.cat.dataStructure02;

import java.util.PriorityQueue;

/**
 * @author 曲大人的喵
 * @description https://leetcode.cn/problems/process-tasks-using-servers/description/
 * @create 2025/10/27 18:01
 * @since JDK17
 */

public class Solution71 {
    public int[] assignTasks(int[] servers, int[] tasks) {
        int n = servers.length, m = tasks.length;
        int[] ans = new int[m];
        PriorityQueue<int[]> h1 = new PriorityQueue<>((a, b) -> {
            if (a[0] != b[0]) {
                return a[0] - b[0];
            } else {
                return a[1] - b[1];
            }
        });
        PriorityQueue<int[]> h2 = new PriorityQueue<>((a, b) -> a[0] - b[0]);
        for (int i = 0; i < n; i++) {   // 机器的处理时间
            h1.add(new int[]{servers[i], i});
        }

        for (int i = 0, j = 0; j < m; ) {  // i : 时间
            while (!h2.isEmpty() && i == h2.peek()[0]) {    // 弹出一个任务
                int[] poll = h2.poll();
                h1.add(new int[]{servers[poll[1]], poll[1]});   // 服务器闲置
            }
            while (j < m && j <= i && !h1.isEmpty() ) {
                int[] poll = h1.poll(); //
                h2.add(new int[] {i + poll[0], poll[1], j});
                ans[j++] = poll[1];
            }
            if (h1.isEmpty()) { // 所有的服务器都被分配出去了
                i = h2.peek()[0];   // 下一次任务完成的时间
            } else {    // 还有任务未完成
                i = Math.max(i + 1, j);
            }
        }

        return ans;
    }
}
